package com.swh.utils;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
import java.util.UUID;

public class FileUploadUtils {

    /**
     * 文件上传工具类
     *
     * @param realPath: 上传到服务器的路径
     * @param request
     * @return
     */
    public static String upload(String realPath, HttpServletRequest request) {
        //为解析类提供配置信息 创建文件上传工厂类
        DiskFileItemFactory factory = new DiskFileItemFactory();

        //创建解析类的实例 传入工厂类获取文件上传对象
        ServletFileUpload sfu = new ServletFileUpload(factory);

        //设置文件最大解析大小(单位：字节)
        sfu.setFileSizeMax(1024 * 400);

        //每个表单域中数据会封装到一个对应的FileItem对象上
        try {
            List<FileItem> items = sfu.parseRequest(request);

            String fileName = "";

            //区分表单域
            for (int i = 0; i < items.size(); i++) {
                FileItem item = items.get(i);
                //isFormField为true，表示这不是文件上传表单域
                if (!item.isFormField()) {

                    // 文件上传的名字
                    String name = item.getName();

                    // 获取文件名后缀          // abc.png --> .png
                    String suffix = name.substring(name.lastIndexOf("."));

                    //获得文件名     abc.png
                    fileName = UUID.randomUUID().toString() + suffix;

                    // 获取 upload在电脑上真实路径
                    // 传递给前端的网络地址(保存到数据库的)
                    String path = "http://localhost:8080/upload";

                    // 服务器真实上传的磁盘地址
                    String dirPath = request.getSession().getServletContext().getRealPath(realPath);        //upload    http://localhost:8080/uplado/ashkldkahsdlkhsa.png

                    // 指定磁盘路径
                    File file = new File(dirPath + "/" + fileName);         // D:/upload/

                    if (!file.exists()) {
                        //将文件写出到指定磁盘
                        item.write(file);
                    }

                    return path + "/" + fileName;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
}